// 随机生成字符串
export function randString(length) {
    const str = "0123456789abcdefghijklmnopqrstuvwxyz"
    const size = str.length
    let buf = []
    for (let i = 0; i < length; i++) {
        // Math.random() * size 会产生浮点数（如 5.7），使用 Math.floor 显式取整，生成指定大小的随机数
        const rand = Math.floor(Math.random() * size)
        buf.push(str.charAt(rand))
    }
    return buf.join("")
}

// 生成 UUID
export function UUID() {
    // 获取当前时间戳
    let d = new Date().getTime()
    // /[xy]/g 全局替换 x和y
    // function (c) c 表示要替换的字符串，返回替换好的字符串
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
        const r = (d + Math.random() * 16) % 16 | 0
        d = Math.floor(d / 16)
        return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16)
    })
}

// 判断是不是移动设备
export function isMobile() {
    // 通过 navigator.userAgent 获取浏览器用户代理字符串
    const userAgent = navigator.userAgent
    const mobileRegex = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|Mobile|mobile|CriOS/i;
    return mobileRegex.test(userAgent);
}

// 格式化日期
export function dateFormat(timestamp, format) {
    // 判断日期是否为空
    if (!timestamp) {
        return ''
    } else if (timestamp < 9680917502) { // 秒级时间戳兼容：通过阈值9680917502（约2030年）判断是否需要转换
        timestamp = timestamp * 1000
    }

    let year, month, day, HH, mm, ss
    let time = new Date(timestamp)
    let timeDate
    year = time.getFullYear() // 年
    month = time.getMonth() + 1 // 月
    day = time.getDate() // 日
    HH = time.getHours() // 时
    mm = time.getMinutes() // 分
    ss = time.getSeconds() // 秒
    // 判断月是否小于10，如果小于就补0
    month = month < 10 ? '0' + month : month
    day = day < 10 ? '0' + day : day
    HH = HH < 10 ? '0' + HH : HH
    mm = mm < 10 ? '0' + mm : mm
    ss = ss < 10 ? '0' + ss : ss

    switch (format) {
        case 'yyyy':
            timeDate = String(year)
            break
        case 'yyyy-MM':
            timeDate = year + '-' + month
            break
        case 'yyyy-MM-dd':
            timeDate = year + '-' + month + '-' +day
            break
        case 'yyyy/MM/dd':
            timeDate = year + '/' + month + '/' +day
            break
        case 'yyyy-MM-dd HH:mm:ss':
            timeDate = year + '-' + month + '-' +day + ' ' + HH + ':' + mm + ':' + ss
            break
        case 'HH:mm:ss':
            timeDate = HH + ':' + mm + ':' + ss
            break
        case 'MM':
            timeDate = String(month)
            break
        default:
            timeDate = year + '-' + month + '-' +day + ' ' + HH + ':' + mm + ':' + ss
            break
    }
    return timeDate
}

// 将秒级时间转换为 分:秒 格式（如 125秒 → 2:05）
export function formatTime(time) {
    // 通过 Math.floor 确保秒数不出现小数（如 65.8秒 → 1:05）
    const minutes = Math.floor(time / 60)
    const seconds = Math.floor(time % 60)
    // ${seconds < 10 ? '0' : ''} 当秒数小于10时添加前导零（如 9秒 → 09）
    return `${minutes}:${seconds < 10 ? '0' : ''}${seconds}`
}

// 判断数组中是否包含某个元素
// array：要检查的目标数组（如果传入null/undefined会直接返回false）
// value：要查找的目标值
// compare：自定义比较函数（可选参数，默认用全等===比较）
export function arrayContains(array, value, compare) {
    if(!array) {
        return false
    }
    // 检查compare参数是否为函数，不是则创建默认比较函数
    if (typeof compare !== 'function') {
        compare = function (v1, v2) {
            return v1 === v2
        }
    }
    for (let i = 0; i < array.length; i++) {
        // 使用比较函数
        if (compare(array[i], value)) {
            return true
        }
    }
    return false
}

// 删除数组中指定元素
export function removeArrayItem(array, value, compare) {
    if (typeof compare !== "function") {
        compare = function (v1, v2) {
            return v1 === v2
        }
    }
    for (let i = 0; i < array.length; i++) {
        if (compare(array[i], value)) {
            array.splice(i,1)
            break
        }
    }
    return array
}

// 渲染输入的换行符
export function renderInputText(text) {
    // 匹配所有类型换行符（\n、\r\n、\r）并统一替换为<br/>
    const replaceRegex = /(\n\r|\r\n|\r|\n)/g
    // 通过 text || '' 防止 null/undefined 输入报错
    text = text || ''
    return text.replace(replaceRegex, "<br/>");
}

// 拷贝对象
export function copyObj(origin) {
    // JSON.stringify(origin)（origin）序列化为JSON 格式的字符串
    // JSON.parse() 将 JSON 字符串解析为全新的 JavaScript 对象，生成一个与原对象无引用关联的副本
    return JSON.parse(JSON.stringify(origin))
}

// 禁用过去日期
// 当传入的 time（日期对象）早于当前时间（Date.now()）时，函数返回 true，对应的日期会被标记为不可选
export function disabledDate(time) {
    return time.getTime() < Date.now()
}

// 字符串截取
export function substr(str,length) {
    let result = ''
    let count = 0
    // 遍历字符串
    for (let i = 0; i < str.length; i++) {
        const char = str.charAt(i)
        const charCode = str.charCodeAt(i)
        // 判断字符串是否为中文字符
        if (charCode >= 0x4e00 && charCode <= 0x9fff) {
            // 中文字符算两个字符
            count += 2
        }else{
            count++
        }
        if (count <= length) {
            result += char
        }else{
            result += " ..."
            break
        }
    }
    return result
}

// 判断是不是图片
export function isImage(url) {
    const expr = /\.(jpg|jpeg|png|gif|bmp|svg)$/i;
    return expr.test(url);
}

// 处理内容函数
export function processContent(content) {
    if (!content) {
        return ""
    }
    // 如果图片是链接地址，则直接替换成图片标签
    // 匹配以 http:// 或 https:// 开头的链接，\S+ 表示非空字符连续出现直到遇到空格或字符串结束
    const linkRegex = /(https?:\/\/\S+)/g
    // 提取所有符合正则的链接到数组 links，若未匹配则返回 null
    const links = content.match(linkRegex)
    if (links) {
        // 遍历链接并处理图片
        for (let link of links) {
            // 判断是不是图片
            if (isImage(link)) {
                // 获取链接在原始内容中的起始位置索引，若同一链接多次出现，indexOf 仅返回第一个匹配位置，可能导致替换错误
                const index = content.indexOf(link)
                // 检查链接前是否有 ] 字符，避免替换 Markdown 链接（如 [文字](http://...)）
                if (content.substring(index - 1, 2) !== ']') {
                    // 将图片链接替换为 Markdown 图片语法 ![](${link})，并添加换行符
                    content = content.replace(link, "\n![](" + link + ")\n")
                }
            }
        }
    }
    return content
}

// 接收用户输入的提示词（prompt），对其进行 HTML 特殊字符转义
export function processPrompt(prompt) {
    // /&/g 匹配所有 & 符号，g 表示全局匹配
    // /</g 匹配所有 < 符号，防止其被解析为 HTML 标签。
    return prompt.replace(/&/g, "&amp;")
        .replace(/</g, "&lt;")
        .replace(/>/g, "&gt;");
}

// 判断是否为微信浏览器
export function isWeChatBrowser() {
    return /MicroMessenger/i.test(navigator.userAgent)
}

// 该函数用于动态处理图片 URL
export const replaceImg = (img) => {
    // 相对路径转绝对路径
    // 当图片路径 img 不以 http 开头时，自动拼接当前协议（location.protocol）和主机地址（location.host），生成完整 URL。
    // 示例：image.jpg → http://当前域名/image.jpg
    if(!img.startsWith("http")) {
        img = `${location.protocol}//${location.host}/${img}`
    }
    // 将包含本地开发服务器地址（http://localhost:5678）的图片 URL，替换为环境变量 VITE_VUE_APP_API_HOST 定义的开发/生产环境 API 主机地址
    const devHost = import.meta.env.VITE_VUE_APP_API_HOST
    const localhost = "http://localhost:5678"
    // img.includes(localhost) 是 字符串方法，用于判断字符串 img 中是否包含子字符串 localhost。
    // 若包含则返回 true，否则返回 false，且区分大小写（例如 LocalHost 不会被匹配）
    if (img.includes(localhost)) {
        // 可选链操作符 ?. 是 JavaScript（ES2020）的特性，用于安全访问可能为 null 或 undefined 的对象属性或方法。
        // 若 img 为 null/undefined，则 img?.replace() 会直接返回 undefined，避免因调用不存在的方法而报错
        return img?.replace(localhost, devHost)
    }
    return img
}

// 判断是不是 chrome 浏览器
export function isChrome() {
    // 通过 navigator.userAgent 获取浏览器的用户代理（UA）字符串。
    // toLowerCase() 将所有字符转为小写，统一匹配规则（如避免 Chrome 和 chrome 的差异）
    const userAgent = navigator.userAgent.toLowerCase()
    // /chrome/.test(userAgent)
    // 检测 UA 中是否包含 chrome 子字符串，用于识别 Chromium 内核浏览器（Chrome、Edge、Opera 等）
    // !/edg/.test(userAgent)
    // 排除 Microsoft Edge 浏览器：Edge 的 UA 中包含 edg（如 Edg/123），而 Chrome 不包含此标记。
    // 关键点：由于 Edge 也基于 Chromium，仅检测 chrome 会导致误判，需额外排除 edg
    return /chrome/.test(userAgent) && !/edg/.test(userAgent);
}